package com.liveneo.adapter.outinterface.util;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

import javax.xml.datatype.DatatypeConfigurationException;
import javax.xml.datatype.DatatypeFactory;
import javax.xml.datatype.XMLGregorianCalendar;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
  * @Description: 工具类：时间处理
  * @author liveneo-shuqw
  * @date 2016年9月23日 下午10:35:01
  * Copyright: Copyright (c) 2016 
  * Company: 北京朗泰
  * @version 3.0
  */
public class DateUtil {
    protected static final Logger log = LoggerFactory.getLogger(DateUtil.class);

    public static final String DEFAULT_PATTERN_DATE = "yyyy-MM-dd";
    public static final String DEFAULT_PATTERN_TIME = "HH:mm:ss";
    public static final String DEFAULT_PATTERN_DATETIME = "yyyy-MM-dd HH:mm:ss";
    public static final String DEFAULT_PATTERN_TIMESTAMP = "yyyyMMddHHmmssSSS";

    /**
     * 获取当前系统时间
     *
     * @return 时间对象
     */
    public static Date getNow() {
        return new Date();
    }

    /**
     * 获取格式化日期或时间
     *
     * @param date          时间对象
     * @param formatPattern 格式化字符串
     * @return
     */
    public static String format(Date date, String formatPattern) {
        if (EmptyUtil.isEmpty(date)) return "";
        if (EmptyUtil.isEmpty(formatPattern)) formatPattern = DEFAULT_PATTERN_DATETIME;
        return new SimpleDateFormat(formatPattern).format(date);
    }

    /**
     * 获取格式化日期
     *
     * @param date 时间对象
     * @return
     */
    public static String formatDate(Date date) {
        return format(date, DEFAULT_PATTERN_DATE);
    }

    /**
     * 获取格式化时间
     *
     * @param date 时间对象
     * @return
     */
    public static String formatTime(Date date) {
        return format(date, DEFAULT_PATTERN_TIME);
    }

    /**
     * 获取格式化日期和时间
     *
     * @param date 时间对象
     * @return
     */
    public static String formatDateTime(Date date) {
        return format(date, DEFAULT_PATTERN_DATETIME);
    }

    /**
     * 获取格式化时间戳
     *
     * @param date 时间对象
     * @return
     */
    public static String formatTimestamp(Date date) {
        return format(date, DEFAULT_PATTERN_TIMESTAMP);
    }

    /**
     * 获取当前系统日期
     *
     * @return
     */
    public static String getNowDate() {
        return formatDate(getNow());
    }

    /**
     * 获取当前系统时间
     *
     * @return
     */
    public static String getNowTime() {
        return formatTime(getNow());
    }

    /**
     * 获取当前系统日期和时间
     *
     * @return
     */
    public static String getNowDateTime() {
        return formatDateTime(getNow());
    }

    /**
     * 获取时间戳
     *
     * @return
     */
    public static String getTimestamp() {
        return formatTimestamp(getNow());
    }

    /**
     * 使用参数Format将字符串转为Date
     *
     * @param strDate 日期字符串
     * @param pattern 格式化字符串
     * @return Date对象
     */
    public static Date parse(String strDate, String pattern) {
        if (EmptyUtil.isEmpty(strDate)) return null;
        if (EmptyUtil.isEmpty(pattern)) pattern = DEFAULT_PATTERN_DATETIME;
        try {
            return new SimpleDateFormat(pattern).parse(strDate);
        } catch (ParseException e) {
        	//e.printStackTrace();
            //log.error(DateUtil.class, e);
        }
        return null;
    }

    /**
     * 将日期字符串转化为Date对象(格式2001-01-01)
     *
     * @param strDate 日期字符串
     * @return Date对象
     */
    public static Date parseDate(String strDate) {
        return parse(strDate, DEFAULT_PATTERN_DATE);
    }

    /**
     * 将日期字符串转化为Date对象(格式12:30:30)
     *
     * @param strDate 日期字符串
     * @return Date对象
     */
    public static Date parseTime(String strDate) {
        return parse(strDate, DEFAULT_PATTERN_TIME);
    }

    /**
     * 将日期字符串转化为Date对象(格式2001-01-01 12:30:30)
     *
     * @param strDate 日期字符串
     * @return Date对象
     */
    public static Date parseDateTime(String strDate) {
        return parse(strDate, DEFAULT_PATTERN_DATETIME);
    }

    /**
     * 将日期字符串转化为Date对象(格式20010101123030222)
     *
     * @param strDate 日期字符串
     * @return Date对象
     */
    public static Date parseTimestamp(String strDate) {
        return parse(strDate, DEFAULT_PATTERN_TIMESTAMP);
    }
    
    /**
      * @Title: dateToXmlDate
      * @Description: 日期转换
      * @param @param date
      * @param @return 设定文件
      * @return XMLGregorianCalendar 返回类型
      * @throws
     */
    public static XMLGregorianCalendar dateToXmlDate(Date date){  
        Calendar cal = Calendar.getInstance();  
        cal.setTime(date);  
        DatatypeFactory dtf = null;  
         try {  
            dtf = DatatypeFactory.newInstance();  
        } catch (DatatypeConfigurationException e) {  
        }  
        XMLGregorianCalendar dateType = dtf.newXMLGregorianCalendar();  
        dateType.setYear(cal.get(Calendar.YEAR));  
        //由于Calendar.MONTH取值范围为0~11,需要加1  
        dateType.setMonth(cal.get(Calendar.MONTH)+1);  
        dateType.setDay(cal.get(Calendar.DAY_OF_MONTH));  
        dateType.setHour(cal.get(Calendar.HOUR_OF_DAY));  
        dateType.setMinute(cal.get(Calendar.MINUTE));  
        dateType.setSecond(cal.get(Calendar.SECOND));  
        return dateType;  
    } 
}
